


import re

from flask import current_app

from . import api

from iHome.utils.commons import login_required
from flask import request, jsonify, session
from iHome.utils.response_code import RET
from iHome import redis_store
from iHome.models import User
from iHome import db
import logging



@api.route('/users',methods=['POST'])
def register_user():
    """
    1. 获取所有参数
    2. 校验参数是否有值
    3. 获取短信验证码
    4. 对比短信验证码
    5. 保存用户数据
    6. 保存用户信息到session
    :return:
    """

    # 1. 获取所有参数
    requ_dict = request.get_json()
    mobile = requ_dict.get("mobile")
    password = requ_dict.get("password")
    sms_code = requ_dict.get("phonecode")

    # 2. 校验参数是否有值
    if not all([mobile, password, sms_code]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 3. 获取本地短信验证码
    try:

        real_sms_code = redis_store.get("SMS_" + mobile)
    except Exception as e:
        current_app.logger.e(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库获取数据错误")
    print(real_sms_code)
    if not real_sms_code:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码已过期")

    # 4. 对比短信验证码
    if real_sms_code.decode() != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")

    # 5. 保存用户数据
    user = User()
    user.name = mobile
    user.mobile = mobile
    user.password = password

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # 6. 保存用户信息到session
    session["user_id"] = user.id
    session["name"] = user.mobile
    session["mobile"] = user.mobile

    return jsonify(errno=RET.OK, errmsg="注册成功")

# 获取登录状态
@api.route('/session')
def check_login():
    name = session.get("name")

    if not name:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    else:
        return jsonify(errno=RET.OK, errmsg="已登录", data={"name": name})



@api.route("/sessions",methods=["POST"])
def login():


    # 获取参数并判空
    data_json = request.get_json()

    mobile = data_json.get("mobile")
    password=data_json.get("password")

    if not all([mobile,password]):
        return jsonify(error=RET.PARAMERR,errmsg="参数不全")

    # 判断手机格式
    if not re.match(r"^1[34578]\d{9}$",mobile):
        return jsonify(error=RET.PARAMERR,errmsg="手机号码格式错误")

    # 从数据库查询出指定的用户
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
        return jsonify(error=RET.DBERR,errmsg="数据库查询错误")

    if not user:
        return jsonify(error=RET.USERERR,errmsg="用户不存在")

    # 校验密码
    if not user.check_password(password):
        return jsonify(error=RET.LOGINERR,errmsg="密码错误")

    # 保存用户登录状态
    session["user_id"]=user.id
    session["mobile"]=user.mobile
    session["name"]=user.name
    # 返回登录成功
    return jsonify(errno=RET.OK, errmsg='登录成功')

# 登出功能
@api.route("/session",methods=['DELETE'])
@login_required
def logout():
    session.pop('name',None)
    session.pop('mobile',None)
    session.pop('user_id',None)
    return jsonify(error=RET.OK,errmsg="OK")